import focusConf from '../../../focus.config';
import runtimeType from '../runtimeType';

/**
 * 【同步方法】操作本框架配置信息
 * @param type 处理方式，值域解释：get-获取、set-设置、cover-覆盖
 * @param item set设置的时候要处理的某项配置名称，如：color
 * @param data set设置的时候要修改的配置项
 * @return 框架配置信息对象
 */
function config(type = 'get', item = '', data = {}) {

    // 初始化返回值
    let data_return = {};
    // 配置信息名
    let str_name = '$focus_config';
    // 获取当前运行环境
    let runType = runtimeType();
    // 非uni环境下，挂载到window上
    if (runType == 'NOT-UNI') {
        // 先根据默认设置初始化一次配置项
        if (!window[str_name]) { window[str_name] = focusConf; }
        // 配置项信息 赋值
        data_return = window[str_name];
    }
    // uni环境下，就挂载到uni上
    else {
        // 先根据默认设置初始化一次配置项
        if (!uni[str_name]) { uni[str_name] = focusConf; }
        // 配置项信息 赋值
        data_return = uni[str_name];
    }
    
    // 如果是设置配置选项
    if (type == 'set') {
        // 如果配置项不存在，先初始化
        if (!data_return[item]) { data_return[item] = {}; }
        // 取出要配置单项
        let obj_opt = data_return[item];
        // 循环传入的修改值
        for (const key in data) {
            // 1. 如果此项是方法
            if (typeof obj_opt[key] == 'function') { obj_opt[key] = data[key]; }
            // 2. 如果此项是对象
            else if (typeof obj_opt[key] == 'object') {
                // 相当于添加
                obj_opt[key] = Object.assign({}, obj_opt[key], data[key]);
            }
            // 3. 其它情况，直接赋值
            else { obj_opt[key] = data[key]; }
        }
    }
    // 如果是覆盖配置项
    else if (type == 'cover') {
        // 整个分类项直接赋值
        data_return[item] = data;
    }

    // 返回结果数据
    return data_return;
}

export default config;